package com.hmkj.core.api.ufx.trade;

import com.hmkj.core.api.ufx.model.req.EntrustNativeReq;
import com.hmkj.core.api.ufx.model.req.EntrustOtcReq;
import com.hmkj.core.api.ufx.model.req.EntrustWithdrawNativeReq;
import com.hmkj.core.api.ufx.model.req.EntrustWithdrawOtcReq;
import com.hmkj.core.exception.BussinessException;
import com.hmkj.core.exception.UFXLoginException;
import com.hundsun.t2sdk.common.core.context.ContextUtil;
import com.hundsun.t2sdk.common.share.dataset.DatasetService;
import com.hundsun.t2sdk.impl.client.T2Services;
import com.hundsun.t2sdk.interfaces.IClient;
import com.hundsun.t2sdk.interfaces.T2SDKException;
import com.hundsun.t2sdk.interfaces.share.dataset.IDataset;
import com.hundsun.t2sdk.interfaces.share.dataset.IDatasets;
import com.hundsun.t2sdk.interfaces.share.event.EventReturnCode;
import com.hundsun.t2sdk.interfaces.share.event.EventType;
import com.hundsun.t2sdk.interfaces.share.event.IEvent;
import lombok.extern.slf4j.Slf4j;

/**
 * Created by 陌上人 on 2077/7/7 21:49.
 * <p>
 * 同步返回数据
 */
@Slf4j
public class UfxTradeSync {

    private IClient client = null;
    private T2Services server = T2Services.getInstance();// 获取T2实例


    // 业务系统编号
    private int SYSNO_OTC_TRADE = 1403;// 外盘期货交易
    private int SYSNO_NATIVE_TRADE = 1400;// 内盘期货交易


    public void Init() throws T2SDKException {
        log.info("ar_tree"); //用logger方式打印
        //ar_tree是配置在配置文件中的服务
        client = server.getClient("ar_tree");
    }

    /**
     * k线查询
     *
     * @param contract_code 合约号
     * @param request_num   查询条数
     * @param period        k线类型
     * @return k线数据
     * @throws T2SDKException ex
     */
    public String ReqFunction4001(String contract_code, String request_num, String period) throws Exception {
        // 获取event
        IEvent event = ContextUtil.getServiceContext().getEventFactory()
                .getEventByAlias("4001", EventType.ET_REQUEST);
        // 往event中添加datase
        IDataset dataset = DatasetService.getDefaultInstance().getDataset();
        dataset.addColumn("contract_code");//合约代码
        dataset.addColumn("period");//k线类型
        dataset.addColumn("request_num"); //条数
        dataset.appendRow();
        dataset.updateString("contract_code", contract_code);
        dataset.updateString("period", period);
        dataset.updateString("request_num", request_num);
        event.setServiceId("4001");//打入功能号
        event.putEventData(dataset);//入参打包
//        event.setIntegerAttributeValue(EventTagdef.TAG_SENDERID, 5);//分配节点为5
        unPackRequest(event, event.getServiceId()); //入参解包，同时打印发送包参数信息
        IEvent rEvent = client.sendReceive(event, 3000);//发送包
        return unPackResponse(rEvent);
    }

    /**
     * 国际期货分时数据查询
     *
     * @param futu_exch_type
     * @param commodity_type
     * @param contract_code
     * @param request_num
     * @return
     * @throws T2SDKException
     */
    public String ReqFunction800050(String futu_exch_type, String commodity_type, String contract_code, String request_num) throws Exception {
        // 获取event
        IEvent event = ContextUtil.getServiceContext().getEventFactory()
                .getEventByAlias("800050", EventType.ET_REQUEST);
        // 往event中添加datase
        IDataset dataset = DatasetService.getDefaultInstance().getDataset();
        dataset.addColumn("futu_exch_type");//交易类别(期货)
        dataset.addColumn("commodity_type");//品种代码类别
        dataset.addColumn("contract_code");//合约代码
        dataset.addColumn("request_num");
        dataset.appendRow();
        dataset.updateString("futu_exch_type", futu_exch_type);
        dataset.updateString("commodity_type", commodity_type);
        dataset.updateString("contract_code", contract_code);
        dataset.updateString("request_num", request_num);
        event.setServiceId("800050");//打入功能号
        event.putEventData(dataset);//入参打包
//        event.setIntegerAttributeValue(EventTagdef.TAG_SENDERID, 5);//分配节点为5
        event.setIntegerAttributeValue("4", SYSNO_OTC_TRADE);//业务系统编号 1403外盘期货交易 1400国内期货交易
        event.setIntegerAttributeValue("71", 5);//外盘券商编号
        unPackRequest(event, event.getServiceId()); //入参解包，同时打印发送包参数信息
        IEvent rEvent = client.sendReceive(event, 3000);//发送包
        return unPackResponse(rEvent);
    }

    /**
     * 国内期货分时数据查询
     *
     * @param contract_code
     * @return
     * @throws T2SDKException
     */
    public String ReqFunction3003(String contract_code) throws Exception {
        // 获取event
        IEvent event = ContextUtil.getServiceContext().getEventFactory()
                .getEventByAlias("3003", EventType.ET_REQUEST);
        // 往event中添加datase
        IDataset dataset = DatasetService.getDefaultInstance().getDataset();
        dataset.addColumn("contract_code");//合约代码
        dataset.appendRow();
        dataset.updateString("contract_code", contract_code);
        event.setServiceId("3003");//打入功能号
        event.putEventData(dataset);//入参打包
        unPackRequest(event, event.getServiceId()); //入参解包，同时打印发送包参数信息
        IEvent rEvent = client.sendReceive(event, 3000);//发送包
        return unPackResponse(rEvent);
    }


    /**
     * 国内期货查询市场列表
     *
     * @return
     * @throws T2SDKException
     */
    public String ReqFunction3007() throws Exception {
        // 获取event
        IEvent event = ContextUtil.getServiceContext().getEventFactory()
                .getEventByAlias("3007", EventType.ET_REQUEST);
        // 往event中添加datase
        IDataset dataset = DatasetService.getDefaultInstance().getDataset();
        dataset.appendRow();
        event.setServiceId("3007");//打入功能号
        event.putEventData(dataset);//入参打包
        unPackRequest(event, event.getServiceId()); //入参解包，同时打印发送包参数信息
        IEvent rEvent = client.sendReceive(event, 3000);//发送包
        return unPackResponse(rEvent);
    }

    /**
     * 日K线数据查询
     *
     * @param futu_exch_type 市场类别
     * @param commodity_type 产品代码
     * @param contract_code  合约代码
     * @param request_num    条数
     * @return
     * @throws T2SDKException
     */
    public String ReqFunction800061(String futu_exch_type, String commodity_type, String contract_code, String request_num) throws Exception {
        // 获取event
        IEvent event = ContextUtil.getServiceContext().getEventFactory()
                .getEventByAlias("800061", EventType.ET_REQUEST);
        // 往event中添加datase
        IDataset dataset = DatasetService.getDefaultInstance().getDataset();
        dataset.addColumn("futu_exch_type");//交易类别(期货)
        dataset.addColumn("commodity_type");//品种代码类别
        dataset.addColumn("contract_code");//合约代码
        dataset.addColumn("request_num");//合约代码
        dataset.appendRow();
        dataset.updateString("futu_exch_type", futu_exch_type);
        dataset.updateString("commodity_type", commodity_type);
        dataset.updateString("contract_code", contract_code);
        dataset.updateString("request_num", request_num);
        event.setServiceId("800061");//打入功能号
        event.putEventData(dataset);//入参打包
//        event.setIntegerAttributeValue(EventTagdef.TAG_SENDERID, 5);//分配节点为5
        unPackRequest(event, event.getServiceId()); //入参解包，同时打印发送包参数信息
        IEvent rEvent = client.sendReceive(event, 3000);//发送包
        return unPackResponse(rEvent);
    }

    /**
     * 查询K线数据
     *
     * @param futu_exch_type 市场类别
     * @param commodity_type 产品代码
     * @param contract_code  合约代码
     * @param k_type         k线类型（3--3分钟，5--5分钟，15--15分钟，30--30分钟，60--1时）
     * @return String
     * @throws T2SDKException ex
     */
    public String ReqFunction800062(String futu_exch_type, String commodity_type, String contract_code, String k_type) throws Exception {
        // 获取event
        IEvent event = ContextUtil.getServiceContext().getEventFactory()
                .getEventByAlias("800062", EventType.ET_REQUEST);
        // 往event中添加datase
        IDataset dataset = DatasetService.getDefaultInstance().getDataset();
        dataset.addColumn("futu_exch_type");//交易类别(期货)
        dataset.addColumn("commodity_type");//品种代码类别
        dataset.addColumn("contract_code");//合约代码
        dataset.addColumn("k_type");//合约代码
        dataset.addColumn("request_num");//合约代码
        dataset.appendRow();
        dataset.updateString("futu_exch_type", futu_exch_type);
        dataset.updateString("commodity_type", commodity_type);
        dataset.updateString("contract_code", contract_code);
        dataset.updateString("k_type", k_type);
        dataset.updateString("request_num", "1000");
        event.setServiceId("800062");//打入功能号
        event.putEventData(dataset);//入参打包
//        event.setIntegerAttributeValue(EventTagdef.TAG_SENDERID, 5);//分配节点为5
        unPackRequest(event, event.getServiceId()); //入参解包，同时打印发送包参数信息
        IEvent rEvent = client.sendReceive(event, 3000);//发送包
        return unPackResponse(rEvent);
    }

    /**
     * 查询国内期货K线数据
     *
     * @param position_str  定位串
     * @param contract_code 合约代码
     * @param period        k线周期  1:1分钟；2:5分钟；3:15分钟；4:30分钟；5:60分钟；6:日K；7:周K；8:月K；
     * @return String
     * @throws T2SDKException ex
     */
    public String ReqFunction3002(String position_str, String contract_code, String period) throws Exception {
        // 获取event
        IEvent event = ContextUtil.getServiceContext().getEventFactory()
                .getEventByAlias("3002", EventType.ET_REQUEST);
        // 往event中添加datase
        IDataset dataset = DatasetService.getDefaultInstance().getDataset();
        dataset.addColumn("contract_code");//合约代码
        dataset.addColumn("period");//k线周期
        dataset.addColumn("request_num");//请求行数
        dataset.addColumn("position_str");//定位串
        dataset.appendRow();
        dataset.updateString("contract_code", contract_code);
        dataset.updateString("period", period);
        dataset.updateString("request_num", "1000");
        dataset.updateString("position_str", position_str);
        event.setServiceId("3002");//打入功能号
        event.putEventData(dataset);//入参打包
//        event.setIntegerAttributeValue(EventTagdef.TAG_SENDERID, 5);//分配节点为5
        unPackRequest(event, event.getServiceId()); //入参解包，同时打印发送包参数信息
        IEvent rEvent = client.sendReceive(event, 3000);//发送包
        return unPackResponse(rEvent);
    }

    /**
     * 设置国内期货主推代码
     *
     * @param contract_code 合约代码
     * @return String
     * @throws T2SDKException ex
     */
    public String ReqFunction3005(String contract_code) throws Exception {
        // 获取event
        IEvent event = ContextUtil.getServiceContext().getEventFactory()
                .getEventByAlias("3005", EventType.ET_REQUEST);
        // 往event中添加datase
        IDataset dataset = DatasetService.getDefaultInstance().getDataset();
        dataset.addColumn("contract_code");//合约代码
        dataset.appendRow();
        dataset.updateString("contract_code", contract_code);
        event.setServiceId("3005");//打入功能号
        event.putEventData(dataset);//入参打包
//        event.setIntegerAttributeValue(EventTagdef.TAG_SENDERID, 5);//分配节点为5
        unPackRequest(event, event.getServiceId()); //入参解包，同时打印发送包参数信息
        IEvent rEvent = client.sendReceive(event, 3000);//发送包
        return unPackResponse(rEvent);
    }

    /**
     * 外盘账号登录
     *
     * @param opStation   站点地址
     * @param fundAccount 资金账号
     * @param password    密码
     * @param sender      API 接口客户编号
     * @param orgNo       API 接口机构编号
     * @return String
     * @throws T2SDKException ex
     */
    public String ReqFunction819450(String opStation, String fundAccount, String password, String sender, int orgNo) throws T2SDKException, UFXLoginException {
        // 获取event
        IEvent event = ContextUtil.getServiceContext().getEventFactory()
                .getEventByAlias("819450", EventType.ET_REQUEST);
        // 往event中添加datase
        IDataset dataset = DatasetService.getDefaultInstance().getDataset();
        dataset.addColumn("op_station");//站点地址
        dataset.addColumn("fund_account");//资金账号
        dataset.addColumn("password");//密码
        dataset.appendRow();
        dataset.updateString("op_station", opStation);
        dataset.updateString("fund_account", fundAccount);
        dataset.updateString("password", password);
        event.setServiceId("819450");//打入功能号
        event.putEventData(dataset);//入参打包
        event.setIntegerAttributeValue("71", orgNo);// 机构编号
        event.setIntegerAttributeValue("4", SYSNO_OTC_TRADE);// 业务编号 1403：外盘期货交易
        String[] senderArray = {"", sender};
        event.setStringArrayAttributeValue("84", senderArray);// 机构编号
//        event.setIntegerAttributeValue(EventTagdef.TAG_SENDERID, 5);//分配节点为5
        unPackRequest(event, event.getServiceId()); //入参解包，同时打印发送包参数信息
        IEvent rEvent = client.sendReceive(event, 3000);//发送包
        return unPackResponse(rEvent);
    }

    /**
     * 内盘账号登录
     *
     * @param opStation   站点地址
     * @param fundAccount 资金账号
     * @param password    密码
     * @param sender      API 接口客户编号
     * @param orgNo       API 接口机构编号
     * @return String
     * @throws T2SDKException ex
     */
    public String ReqFunction819700(String opStation, String fundAccount, String password, String sender, int orgNo) throws T2SDKException, UFXLoginException {
        // 获取event
        IEvent event = ContextUtil.getServiceContext().getEventFactory()
                .getEventByAlias("819700", EventType.ET_REQUEST);
        // 往event中添加datase
        IDataset dataset = DatasetService.getDefaultInstance().getDataset();
        dataset.addColumn("op_station");//站点地址
        dataset.addColumn("fund_account");//资金账号
        dataset.addColumn("password");//密码
        dataset.appendRow();
        dataset.updateString("op_station", opStation);
        dataset.updateString("fund_account", fundAccount);
        dataset.updateString("password", password);
        event.setServiceId("819700");//打入功能号
        event.putEventData(dataset);//入参打包
        event.setIntegerAttributeValue("71", orgNo);// 机构编号
        event.setIntegerAttributeValue("4", SYSNO_NATIVE_TRADE);// 业务编号 1400：内盘期货交易
        String[] senderArray = {"", sender};
        event.setStringArrayAttributeValue("84", senderArray);// 机构编号
//        event.setIntegerAttributeValue(EventTagdef.TAG_SENDERID, 5);//分配节点为5
        unPackRequest(event, event.getServiceId()); //入参解包，同时打印发送包参数信息
        IEvent rEvent = client.sendReceive(event, 3000);//发送包
        return unPackResponse(rEvent);
    }

    /**
     * 外盘普通委托
     *
     * @param req    委托参数
     * @param sender API 接口客户编号
     * @param orgNo  API 接口机构编号
     * @return
     * @throws T2SDKException
     */
    public String ReqFunction819455(EntrustOtcReq req, String sender, int orgNo) throws T2SDKException, UFXLoginException {
        // 获取event
        IEvent event = ContextUtil.getServiceContext().getEventFactory()
                .getEventByAlias("819455", EventType.ET_REQUEST);
        // 往event中添加datase
        IDataset dataset = DatasetService.getDefaultInstance().getDataset();
        dataset.addColumn("op_station");//站点地址
        dataset.addColumn("user_token");//通讯令牌
        dataset.addColumn("fund_account");//资金账号
        dataset.addColumn("futu_exch_type");//交易类别
        dataset.addColumn("commodity_type");//品种代码类别
        dataset.addColumn("contract_code");//合约代码
        dataset.addColumn("second_code");//第二腿合约代码
        dataset.addColumn("futu_product_type");//产品类型
        dataset.addColumn("entrust_bs");//买卖方向
        dataset.addColumn("entrust_amount");//委托数量
        dataset.addColumn("futu_entrust_price");//期货委托价格
        dataset.addColumn("futu_entrust_prop");//期货委托属性
//        dataset.addColumn("spring_price");//止损价格
        dataset.addColumn("time_condition");//成交量类型
//        dataset.addColumn("valid_date");//有效日期
        dataset.addColumn("today_flag");//T+1标记
        dataset.addColumn("hedge_type");//投机套保标志
        dataset.addColumn("idempotency_flag");//幂等控制标志
        dataset.addColumn("entrust_reference");//委托引用
        dataset.appendRow();
        dataset.updateString("op_station", req.getOpStation());//站点地址
        dataset.updateString("user_token", req.getUserToken());//通讯令牌
        dataset.updateString("fund_account", req.getFundAccount());//资金账号
        dataset.updateString("futu_exch_type", req.getFutuExchType());//交易类别
        dataset.updateString("commodity_type", req.getCommodityType());//品种代码类别
        dataset.updateString("contract_code", req.getContractCode());//合约代码
        dataset.updateString("second_code", req.getSecondCode());//第二腿合约代码
        dataset.updateString("futu_product_type", req.getFutuProductType());//产品类型
        dataset.updateString("entrust_bs", req.getEntrustBs());//买卖方向
        dataset.updateInt("entrust_amount", req.getEntrustAmount());//委托数量
        dataset.updateDouble("futu_entrust_price", req.getFutuEntrustPrice().doubleValue());//期货委托价格
        dataset.updateString("futu_entrust_prop", req.getFutuEntrustProp());//期货委托属性
//        dataset.updateDouble("spring_price", req.getSpringPrice().doubleValue());//止损价格
        dataset.updateInt("time_condition", req.getTimeCondition());//成交量类型
//        dataset.updateInt("valid_date", req.getValidDate());//有效日期
        dataset.updateString("today_flag", req.getTodayFlag());//T+1标记
        dataset.updateString("hedge_type", req.getHedgeType());//投机套保标志
        dataset.updateString("idempotency_flag", req.getIdempotencyFlag());//幂等控制标志
        dataset.updateString("entrust_reference", req.getEntrustReference());//委托引用
        event.setServiceId("819455");//打入功能号
        event.putEventData(dataset);//入参打包
        event.setIntegerAttributeValue("71", orgNo);// 机构编号
        event.setIntegerAttributeValue("4", SYSNO_OTC_TRADE);// 业务编号 1403：外盘期货交易
        String[] senderArray = {"", sender};
        event.setStringArrayAttributeValue("84", senderArray);// 机构编号
//        event.setIntegerAttributeValue(EventTagdef.TAG_SENDERID, 5);//分配节点为5
        unPackRequest(event, event.getServiceId()); //入参解包，同时打印发送包参数信息
        IEvent rEvent = client.sendReceive(event, 3000);//发送包
        return unPackResponse(rEvent);
    }

    /**
     * 内盘普通委托
     *
     * @param req    委托参数
     * @param sender API 接口客户编号
     * @param orgNo  API 接口机构编号
     * @return
     * @throws T2SDKException
     */
    public String ReqFunction819706(EntrustNativeReq req, String sender, int orgNo) throws T2SDKException, UFXLoginException {
        // 获取event
        IEvent event = ContextUtil.getServiceContext().getEventFactory()
                .getEventByAlias("819706", EventType.ET_REQUEST);
        // 往event中添加datase
        IDataset dataset = DatasetService.getDefaultInstance().getDataset();
        dataset.addColumn("user_token");//通讯令牌
        dataset.addColumn("futu_exch_type");//交易类别
        dataset.addColumn("contract_code");//合约代码
        dataset.addColumn("entrust_bs");//买卖方向
        dataset.addColumn("futures_direction");//开平仓方向
        dataset.addColumn("hedge_type");//投机套保标志
        dataset.addColumn("entrust_amount");//委托数量
        dataset.addColumn("futu_entrust_price");//期货委托价格
        dataset.addColumn("entrust_prop");//期货委托属性
        dataset.addColumn("entrust_reference");//委托引用
        dataset.appendRow();
        dataset.updateString("user_token", req.getUserToken());//通讯令牌
        dataset.updateString("futu_exch_type", req.getFutuExchType());//交易类别
        dataset.updateString("contract_code", req.getContractCode());//合约代码
        dataset.updateString("entrust_bs", req.getEntrustBs());//买卖方向
        dataset.updateString("futures_direction", req.getFuturesDirection());//买卖方向
        dataset.updateInt("entrust_amount", req.getEntrustAmount());//委托数量
        dataset.updateDouble("futu_entrust_price", req.getFutuEntrustPrice().doubleValue());//期货委托价格
        dataset.updateString("entrust_prop", req.getEntrustProp());//期货委托属性
        dataset.updateString("hedge_type", req.getHedgeType());//投机套保标志
        dataset.updateString("entrust_reference", req.getEntrustReference());//委托引用
        event.setServiceId("819706");//打入功能号
        event.putEventData(dataset);//入参打包
        event.setIntegerAttributeValue("71", orgNo);// 机构编号
        event.setIntegerAttributeValue("4", SYSNO_NATIVE_TRADE);// 业务编号 1403：外盘期货交易
        String[] senderArray = {"", sender};
        event.setStringArrayAttributeValue("84", senderArray);// 机构编号
        unPackRequest(event, event.getServiceId()); //入参解包，同时打印发送包参数信息
        IEvent rEvent = client.sendReceive(event, 3000);//发送包
        return unPackResponse(rEvent);
    }


    /**
     * 内盘客户资金查询
     *
     * @param userToken 用户口令
     * @param moneyType 币种类别
     * @param sender    API 接口客户编号
     * @param orgNo     API 接口机构编号
     * @return
     * @throws T2SDKException
     */
    public String ReqFunction819708(String userToken, String moneyType, String sender, int orgNo) throws T2SDKException, UFXLoginException {
        // 获取event
        IEvent event = ContextUtil.getServiceContext().getEventFactory()
                .getEventByAlias("819708", EventType.ET_REQUEST);
        // 往event中添加datase
        IDataset dataset = DatasetService.getDefaultInstance().getDataset();
        dataset.addColumn("user_token");//用户口令
        dataset.addColumn("money_type");//币种类别
        dataset.appendRow();
        dataset.updateString("user_token", userToken);//用户口令
        dataset.updateString("money_type", moneyType);//币种类别
        event.setServiceId("819708");//打入功能号
        event.putEventData(dataset);//入参打包
        event.setIntegerAttributeValue("71", orgNo);// 机构编号
        event.setIntegerAttributeValue("4", SYSNO_NATIVE_TRADE);// 业务编号 1403：外盘期货交易
        String[] senderArray = {"", sender};
        event.setStringArrayAttributeValue("84", senderArray);// 机构编号
        unPackRequest(event, event.getServiceId()); //入参解包，同时打印发送包参数信息
        IEvent rEvent = client.sendReceive(event, 3000);//发送包
        return unPackResponse(rEvent);
    }

    /**
     * 内盘客户账单确认
     *
     * @param userToken 用户口令
     * @param sender    API 接口客户编号
     * @param orgNo     API 接口机构编号
     * @return
     * @throws T2SDKException
     */
    public String ReqFunction819705(String userToken, String sender, int orgNo) throws T2SDKException, UFXLoginException {
        // 获取event
        IEvent event = ContextUtil.getServiceContext().getEventFactory()
                .getEventByAlias("819705", EventType.ET_REQUEST);
        // 往event中添加datase
        IDataset dataset = DatasetService.getDefaultInstance().getDataset();
        dataset.addColumn("user_token");//用户口令
        dataset.appendRow();
        dataset.updateString("user_token", userToken);//用户口令
        event.setServiceId("819705");//打入功能号
        event.putEventData(dataset);//入参打包
        event.setIntegerAttributeValue("71", orgNo);// 机构编号
        event.setIntegerAttributeValue("4", SYSNO_NATIVE_TRADE);// 业务编号 1403：外盘期货交易
        String[] senderArray = {"", sender};
        event.setStringArrayAttributeValue("84", senderArray);// 机构编号
        unPackRequest(event, event.getServiceId()); //入参解包，同时打印发送包参数信息
        IEvent rEvent = client.sendReceive(event, 3000);//发送包
        return unPackResponse(rEvent);
    }

    /**
     * 外盘委托撤单
     *
     * @param req 参数
     * @return
     * @throws T2SDKException
     */
    public String ReqFunction819456(EntrustWithdrawOtcReq req, String sender, int orgNo) throws Exception {
        // 获取event
        IEvent event = ContextUtil.getServiceContext().getEventFactory()
                .getEventByAlias("819456", EventType.ET_REQUEST);
        // 往event中添加datase
        IDataset dataset = DatasetService.getDefaultInstance().getDataset();
        dataset.addColumn("op_station");//站点地址
        dataset.addColumn("user_token");//通讯令牌
        dataset.addColumn("fund_account");//资金账号
        dataset.addColumn("futu_entrust_no");//委托编号
        dataset.addColumn("futu_exch_type");//交易类别
        dataset.addColumn("commodity_type");//品种代码类别
        dataset.addColumn("contract_code");//合约代码
        dataset.addColumn("idempotency_flag");//幂等控制标志
        dataset.addColumn("entrust_reference");//委托引用
        dataset.appendRow();
        dataset.updateString("op_station", req.getOpStation());//站点地址
        dataset.updateString("user_token", req.getUserToken());//通讯令牌
        dataset.updateString("fund_account", req.getFundAccount());//资金账号
        dataset.updateString("futu_entrust_no", req.getFutuEntrustNo());//委托编号
        dataset.updateString("futu_exch_type", req.getFutuExchType());//交易类别
        dataset.updateString("commodity_type", req.getCommodityType());//品种代码类别
        dataset.updateString("contract_code", req.getContractCode());//合约代码
        dataset.updateString("idempotency_flag", req.getIdempotencyFlag());//幂等控制标志
        dataset.updateString("entrust_reference", req.getEntrustReference());//委托引用
        event.setServiceId("819456");//打入功能号
        event.putEventData(dataset);//入参打包
        event.setIntegerAttributeValue("71", orgNo);// 机构编号
        event.setIntegerAttributeValue("4", SYSNO_OTC_TRADE);// 业务编号 1403：外盘期货交易
        String[] senderArray = {"", sender};
        event.setStringArrayAttributeValue("84", senderArray);// 机构编号
//        event.setIntegerAttributeValue(EventTagdef.TAG_SENDERID, 5);//分配节点为5
        unPackRequest(event, event.getServiceId()); //入参解包，同时打印发送包参数信息
        IEvent rEvent = client.sendReceive(event, 3000);//发送包
        if ("3001".equals(rEvent.getErrorNo())) {

        }
        return unPackResponse(rEvent);
    }

    /**
     * 内盘委托撤单
     *
     * @param req 参数
     * @return
     * @throws T2SDKException
     */
    public String ReqFunction819707(EntrustWithdrawNativeReq req, String sender, int orgNo) throws Exception {
        // 获取event
        IEvent event = ContextUtil.getServiceContext().getEventFactory()
                .getEventByAlias("819707", EventType.ET_REQUEST);
        // 往event中添加datase
        IDataset dataset = DatasetService.getDefaultInstance().getDataset();
        dataset.addColumn("user_token");//通讯令牌
        dataset.addColumn("entrust_no");//委托编号
        dataset.addColumn("futu_exch_type");//交易类别
        dataset.addColumn("contract_code");//合约代码
        dataset.addColumn("entrust_reference");//委托引用
        dataset.appendRow();
        dataset.updateString("user_token", req.getUserToken());//通讯令牌
        dataset.updateString("entrust_no", req.getEntrustNo());//委托编号
        dataset.updateString("futu_exch_type", req.getFutuExchType());//交易类别
        dataset.updateString("contract_code", req.getContractCode());//合约代码
        dataset.updateString("entrust_reference", req.getEntrustReference());//委托引用
        event.setServiceId("819707");//打入功能号
        event.putEventData(dataset);//入参打包
        event.setIntegerAttributeValue("71", orgNo);// 机构编号
        event.setIntegerAttributeValue("4", SYSNO_NATIVE_TRADE);// 业务编号 1400：内盘期货交易
        String[] senderArray = {"", sender};
        event.setStringArrayAttributeValue("84", senderArray);// 机构编号
//        event.setIntegerAttributeValue(EventTagdef.TAG_SENDERID, 5);//分配节点为5
        unPackRequest(event, event.getServiceId()); //入参解包，同时打印发送包参数信息
        IEvent rEvent = client.sendReceive(event, 3000);//发送包
        if ("3001".equals(rEvent.getErrorNo())) {

        }
        return unPackResponse(rEvent);
    }


    /**
     * 外盘委托查询
     *
     * @param fundAccount   请求参数
     * @param userToken     请求参数
     * @param futuEntrustNo 请求参数
     * @return
     * @throws T2SDKException
     */
    public String ReqFunction819460(String fundAccount, String userToken, String futuEntrustNo) throws Exception {
        // 获取event
        IEvent event = ContextUtil.getServiceContext().getEventFactory()
                .getEventByAlias("819460", EventType.ET_REQUEST);
        // 往event中添加datase
        IDataset dataset = DatasetService.getDefaultInstance().getDataset();
        dataset.addColumn("user_token");//通讯令牌
        dataset.addColumn("fund_account");//资金账号
        dataset.addColumn("futu_entrust_no");//委托编号
        dataset.appendRow();
        dataset.updateString("user_token", userToken);//通讯令牌
        dataset.updateString("fund_account", fundAccount);//资金账号
        dataset.updateString("futu_entrust_no", futuEntrustNo);//委托编号
        event.setServiceId("819460");//打入功能号
        event.putEventData(dataset);//入参打包
//        event.setIntegerAttributeValue(EventTagdef.TAG_SENDERID, 5);//分配节点为5
        unPackRequest(event, event.getServiceId()); //入参解包，同时打印发送包参数信息
        IEvent rEvent = client.sendReceive(event, 3000);//发送包
        return unPackResponse(rEvent);
    }


    /**
     * 外盘期货分笔成交查询
     *
     * @return
     * @throws T2SDKException
     */
    public String ReqFunction819461(String token, String accountNo, String sender, int orgNo) throws Exception {
        // 获取event
        IEvent event = ContextUtil.getServiceContext().getEventFactory()
                .getEventByAlias("819461", EventType.ET_REQUEST);
        // 往event中添加datase
        IDataset dataset = DatasetService.getDefaultInstance().getDataset();
        dataset.addColumn("user_token");//通讯令牌
        dataset.addColumn("fund_account");//资金账号
        dataset.appendRow();
        dataset.updateString("user_token", token);//通讯令牌
        dataset.updateString("fund_account", accountNo);//资金账号
        event.setServiceId("819461");//打入功能号
        event.putEventData(dataset);//入参打包
        event.setIntegerAttributeValue("71", orgNo);// 机构编号
        event.setIntegerAttributeValue("4", SYSNO_OTC_TRADE);// 业务编号 1403：外盘期货交易
        String[] senderArray = {"", sender};
        event.setStringArrayAttributeValue("84", senderArray);// 机构编号
//        event.setIntegerAttributeValue(EventTagdef.TAG_SENDERID, 5);//分配节点为5
        unPackRequest(event, event.getServiceId()); //入参解包，同时打印发送包参数信息
        IEvent rEvent = client.sendReceive(event, 3000);//发送包
        if ("3001".equals(rEvent.getErrorNo())) {

        }
        return unPackResponse(rEvent);
    }


    /**
     * 内盘期货分笔成交查询
     *
     * @return
     * @throws T2SDKException
     */
    public String ReqFunction3004(String contractCode, int requestNum, String sender, int orgNo) throws Exception {
        // 获取event
        IEvent event = ContextUtil.getServiceContext().getEventFactory()
                .getEventByAlias("3004", EventType.ET_REQUEST);
        // 往event中添加datase
        IDataset dataset = DatasetService.getDefaultInstance().getDataset();
        dataset.addColumn("contract_code");//合约代码
        dataset.addColumn("request_num");//请求行数
        dataset.appendRow();
        dataset.updateString("contract_code", contractCode);//通讯令牌
        dataset.updateInt("request_num", requestNum);//资金账号
        event.setServiceId("3004");//打入功能号
        event.putEventData(dataset);//入参打包
        event.setIntegerAttributeValue("71", orgNo);// 机构编号
        event.setIntegerAttributeValue("4", SYSNO_OTC_TRADE);// 业务编号 1403：外盘期货交易
        String[] senderArray = {"", sender};
        event.setStringArrayAttributeValue("84", senderArray);// 机构编号
//        event.setIntegerAttributeValue(EventTagdef.TAG_SENDERID, 5);//分配节点为5
        unPackRequest(event, event.getServiceId()); //入参解包，同时打印发送包参数信息
        IEvent rEvent = client.sendReceive(event, 3000);//发送包
        if ("3001".equals(rEvent.getErrorNo())) {

        }
        return unPackResponse(rEvent);
    }


    //设置包头信息
    public void setEventHead(IEvent event, int compId) {
        //设置companyID
        event.setIntegerAttributeValue("71", compId);
        //设置subSystemID
        event.setIntegerAttributeValue("4", 1400);
        //设置senderCompanyID
        String[] senderArray = new String[2];
        senderArray[0] = "";
        senderArray[1] = "30058";
        event.setStringArrayAttributeValue("84", senderArray);
    }

    private void unPackRequest(IEvent event, String functionId) {
        unPack(event);
//        System.out.println("功能号" + functionId + "运行\n以下是相关入参：\n" + result);//打印入参
    }

    //业务包解包，并打印包
    private String unPack(IEvent event) {
        StringBuilder sb = new StringBuilder();
        //获取返回集
        IDatasets result = event.getEventDatas();
        //获取结果集总数
        int datasetCount = result.getDatasetCount();
        //遍历所有的结果集
        for (int i = 0; i < datasetCount; i++) {
            //读取单个结果集信息
            IDataset ds = result.getDataset(i);
            int columnCount = ds.getColumnCount(); //获取数据数量
            //System.out.println(arg0.getServiceId());
            //打印结果集标题
            for (int j = 1; j <= columnCount; j++) {
                sb.append(ds.getColumnName(j));
                sb.append(",");
            }
            //遍历单个结果集记录，遍历前首先将指针置到开始
            ds.beforeFirst();
            //打印结果集数据
            while (ds.hasNext()) {
                sb.append("\n");
                ds.next();
                for (int j = 1; j <= columnCount; j++) {
                    sb.append(ds.getString(j)).append(",");
                }
            }
        }
        return sb.toString();
    }

    private String unPackResponse(IEvent event) throws UFXLoginException {
        //判断返回值
        if (event.getReturnCode() != EventReturnCode.I_OK) {//返回错误
            StringBuilder sb = new StringBuilder();
            //获取结果集
            IDatasets result = event.getEventDatas();
            String errorInfo = event.getErrorInfo();
            String errorNo = event.getErrorNo();
            if (!"".equals(errorInfo)) {
                sb.append(errorInfo);
            } else {
                //获取结果集个数
                int datasetCount = result.getDatasetCount();
                //System.out.println(event.getServiceId());
                //遍历结果集
                for (int i = 0; i < datasetCount; i++) {
                    IDataset ds = result.getDataset(i);
                    int columnCount = ds.getColumnCount();
                    //打印结果集标注
                    for (int j = 1; j <= columnCount; j++) {
                        sb.append(ds.getColumnName(j));
                        sb.append(",");
                    }
                    //遍历单个结果集记录，遍历前首先将指针置到开始
                    ds.beforeFirst();
                    while (ds.hasNext()) {
                        sb.append("\n");
                        ds.next();
                        //打印结果集数据
                        for (int j = 1; j <= columnCount; j++) {
                            sb.append(ds.getString(j)).append(",");
                        }
                    }
                }
            }
            log.error("请求错误" + sb.toString());
            if ("3000".equals(errorNo)) {
                throw new UFXLoginException(errorNo, errorInfo);
            } else {
                throw new BussinessException(sb.toString());
            }
        } else {
            return unPack(event);
        }
    }
}
